Google workflowsでSecretManagerコネクタを使ってみる
はじめに
データアナリティクス事業本部のkobayashiです。
GoogleCloudのWorkflowsでシークレット情報を扱う場合にはワークフロー内に埋め込んだり、変数として与えることはセキュリティ上好ましくないです。このような場合にはワークフロー中でSecretManagerに保存してあるシークレット情報を使うことでこれらの要件を満たすことができます。今回はこの方法を試してみたのでまとめます。
WorkflowsのSecretManagerコネクタ
WorkflowsのSecretManagerコネクタはワークフローのStepにてSecretManagerからシークレット情報を取得・保存することができるコネクタになります。SecretManagerコネクタを使うことでAPIを直接使ってSecretManagerの情報にアクセスするよりも簡単にSecretManagerの情報を扱うことができます。
Secret Manager API Connector Overview | Workflows | Google Cloud
では早速試してみます。
SecretManagerコネクタを試してみる
workflowsのyamlファイルは次のものを使います。
main:
steps:
- init:
assign:
- base_url: https://api.e-stat.go.jp
- search_word: 消費者物価指数
- secret_id: estat_api_id
- access_secret:
call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
args:
secret_id: ${secret_id}
project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
result: estat_api_id
- call_api:
call: http.get
args:
url: ${ base_url + "/rest/3.0/app/json/getStatsList?appId=" + estat_api_id + "&searchWord=" + search_word }
result: result_api
- the_end:
return:
- ${result_api.body.GET_STATS_LIST.DATALIST_INF.TABLE_INF}
これは 政府統計の総合窓口 e-Stat のAPIを使って統計表情報から消費者物価指数(CPI)に関係する統計情報を取得するワークフローです。
e-Statではユーザー登録をしてアプリケーションIDを取得しこのアプリケーションIDを使ってAPI機能を利用することができますが、そのアプリケーションIDをシークレット情報としてSecretManagerに保存し、ワークフローでAPIの呼び出し時に使用します。
それではこのワークフローを実行するために準備をします。
はじめにアプリケーションIDをSecretManagerに登録します。
$ gcloud secrets create estat_api_id --replication-policy="automatic"
$ printf "{アプリケーションID}" | gcloud secrets versions add estat_api_id --data-file=-
$ gcloud secrets versions access latest --secret=estat_api_id
aaaaabbbbbccccc111112222233333
次にワークフローの実行時に使うサービスアカウントを登録します。ワークフロー中でSecretManagerからシークレット情報を取得するのでその権限が必要になります。
先に登録したSecretManagerのリソースのread権限のみに絞りたいので以下のようなコマンドでポリシーを付与します。
$ gcloud projects add-iam-policy-binding {プロジェクトID} \
--member="serviceAccount:wf-sa-for-sm@{プロジェクトID}.iam.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor" \
--condition="expression=resource.name.endsWith('/secrets/estat_api_id/versions/latest'),title=AccessToEstatApiIdSecret,description=Allows access only to the estat_api_id secret"
これで準備は整ったので これをdeployして実行してみます。
$ gcloud workflows deploy wf-api_key_from_sm \
--source=wf-api_key_from_sm.yml \
--location asia-northeast1 \
--service-account=wf-sa-for-sm@{プロジェクトID}.iam.gserviceaccount.com
$ gcloud workflows run wf-api_key_from_sm --location asia-northeast1
argument: 'null'
createTime: '2024-10-21T21:24:28.756711771Z'
duration: 19.475659372s
endTime: '2024-10-21T21:24:48.232371143Z'
name: projects/1234567890/locations/asia-northeast1/workflows/wf-api_key_from_sm/executions/4293941f-1c87-4a37-b270-7075c93ab49b
result: '[[{"@id":"0000010103","COLLECT_AREA":"全国","CYCLE":"年度次","DESCRIPTION":{"TABULATION_CATEGORY_EXPLANATION":"社会・人口統計体系の都道府県ごとに集計したデータを提供します。"},"GOV_ORG":{"$":"総務省","@code":"00200"},"MAIN_CATEGORY":{"$":"その他","@code":"99"},"OPEN_DATE":"2024-02-20","OVERALL_TOTAL_NUMBER":350016,"SMALL_AREA":0,"STATISTICS_NAME":"都道府県データ
基礎データ","STATISTICS_NAME_SPEC":{"TABULATION_CATEGORY":"都道府県データ","TABULATION_SUB_CATEGORY1":"基礎データ"},"STAT_NAME":{"$":"社会・人口統計体系","@code":"00200502"},"SUB_CATEGORY":{"$":"その他","@code":"99"},"SURVEY_DATE":0,"TITLE":{"$":"C 経済基盤","@no":"0000010103"},"TITLE_SPEC":{"TABLE_NAME":"C 経済基盤"},"UPDATED_DATE":"2024-06-26"},....'
startTime: '2024-10-21T21:24:28.756711771Z'
state: SUCCEEDED
status:
currentSteps:
- routine: main
step: the_end
workflowRevisionId: 000021-f1e
SecretManagerに登録したシークレット情報でAPIを呼び出して情報を取得できました。今回は登録してある情報を取得するだけでしたがシークレット情報を登録することもSecretManagerコネクタを使うことで実現ができます。
使い所としては、Access TokenとRefresh Tokenを持つAPIでは定期的にRefresh TokenでAccess Tokenを更新する必要がありますが、ワークフロー中で更新されたAccess Tokenを保存して後続の処理で利用するような場面でも使えるのかと思います。
まとめ
GoogleCloudのWorkflowsでSecretManagerに保存してあるシークレット情報を使ってAPIの呼び出しを実行してみました。サービスアカウントの権限の設定さえ行っておけば簡単にSecretManagerのリソースを扱うことができます。
最後まで読んで頂いてありがとうございました。